isf 0.1.0

Parsing, Deserialization and Serialization of the Interactive Shader Format.
Documentation
/*
{
  "CATEGORIES" : [
    "Glitch"
  ],
  "DESCRIPTION" : "Causes only part of an image to update",
  "ISFVSN" : "2",
  "INPUTS" : [
    {
      "NAME" : "inputImage",
      "TYPE" : "image"
    },
    {
      "NAME" : "maxUpdateSize",
      "TYPE" : "float",
      "MAX" : 1,
      "DEFAULT" : 0.5,
      "LABEL" : "Size",
      "MIN" : 0
    },
    {
      "NAME" : "maxBlendAmount",
      "TYPE" : "float",
      "MAX" : 1,
      "DEFAULT" : 0,
      "MIN" : 0
    },
    {
      "NAME" : "resetImage",
      "TYPE" : "event",
      "LABEL" : "Reset Image"
    }
  ],
  "PASSES" : [
    {
      "TARGET" : "lastState",
      "PERSISTENT" : true,
      "DESCRIPTION" : ""
    }
  ],
  "CREDIT" : "VIDVOX"
}
*/

float rand(vec2 co){
    return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
}

vec4 rand4(vec4 co)	{
	vec4	returnMe = vec4(0.0);
	returnMe.r = rand(co.rg);
	returnMe.g = rand(co.gb);
	returnMe.b = rand(co.ba);
	returnMe.a = rand(co.rb);
	return returnMe;
}

vec3 hsv2rgb(vec3 c)	{
	vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
	vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
	return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
}

const float pi = 3.14159265359;


bool pointInRect(vec2 pt, vec4 r)
{
	bool	returnMe = false;
	if ((pt.x >= r.x)&&(pt.y >= r.y)&&(pt.x <= r.x + r.z)&&(pt.y <= r.y + r.w))
		returnMe = true;
	return returnMe;
}

void main()	{
	vec2	loc = isf_FragNormCoord.xy;
	bool	doReset = ((resetImage)||(FRAMEINDEX==0));
	vec4	returnMe = (doReset) ? IMG_THIS_PIXEL(inputImage) : IMG_THIS_PIXEL(lastState);
	vec4	seeds1 = TIME * vec4(0.2123,0.34517,0.53428,0.7431);
	vec4	randCoords = rand4(seeds1);
	randCoords.zw *= maxUpdateSize;
	if (randCoords.x + randCoords.z > 1.0)
		randCoords.z = 1.0 - randCoords.x;
	if (randCoords.y + randCoords.w > 1.0)
		randCoords.w = 1.0 - randCoords.y;

	bool	isInShape = pointInRect(loc,randCoords);
	
	if (isInShape)	{
		float		mixAmount = maxBlendAmount * rand(vec2(TIME,0.32234));
		vec4		newColor = IMG_THIS_PIXEL(inputImage);
		newColor.a = 1.0;
		returnMe = mix(newColor,returnMe,mixAmount);
	}
	
	gl_FragColor = returnMe;
}